在 /etc/apt/sources.list 里添加 contrib 仓库之后,执行 apt install zfsutils-linux 进行安装。
安装过程会往内核里加入 ZFS 支持。
zpool create <pool_name> <pool_type> <device_name> 创建一个存储池。
zpool attach <pool_name> <device_in_pool> <device_name> 向池中添加一个设备使 /strip* 变成 mirror 。
zpool detach <pool_name> <pool_device_name> 让一个池中的设备脱离池。
zpool remove <pool_name> <pool_device_name> 从一个池中删除一个设备。
zpool offline <pool_name> <device_name> 让一个池中的设备离线。
zpool scrub <pool_name> 同步池中的数据后,检测池中数据的错误并修复。
zpool add <zpool_name> log <device> 给没有 SLOG 设备的池添加一个 SLOG 设备。
zpool attach <zpool_name> <log_device> <device> 向已有一个 SLOG 设备的池添加另一个 SLOG 设备使之互为镜像。
zpool add <zpool_name> log mirror <device_a> <device_b> 直接添加两个互为镜像的 SLOG 设备。
创建快照后,文件系统变成只读,只有文件块的引用改变后,zfs 才会使用硬盘空间记录被改变的文件块。
快照无法被直接使用,但可以被克隆、备份与回滚。
创建一个叫 datapool 的池:
# zpool create datapool mirror /dev/sdb /dev/sdc
# zpool list
NAME       SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
datapool  1.98G    65K  1.98G         -     0%     0%  1.00x  ONLINE  -
创建一个新的文件系统并挂载:
# zfs create datapool/docs -o mountpoint=/docs
# zfs list -r datapool
NAME            USED  AVAIL  REFER  MOUNTPOINT
datapool       93.5K  1.92G    19K  /datapool
datapool/docs    19K  1.92G    19K  /docs
快照名称格式为 <filesystem-name>@<snap-name> 或 <volume-name>@<snap-name> 。创建快照:
# zfs snapshot datapool/docs@version1
# zfs list -t snapshot
NAME                     USED  AVAIL  REFER  MOUNTPOINT
datapool/docs@version1      0      -  19.5K  -
datapool/docs 文件系统的一个名为 version1 的快照创建完成。
删除一个快照:
# zfs destroy datapool/docs@version1
# zfs list -t snapshot
no datasets available
模拟操作,先创建一个文件:
# echo "version 1" > /docs/data.txt
# cat /docs/data.txt
version 1
创建快照:
# zfs snapshot datapool/docs@version1
# zfs list -t snapshot
NAME                     USED  AVAIL  REFER  MOUNTPOINT
datapool/docs@version1     9K      -  19.5K  -
改变 /docs/data.txt 的内容:
# echo "version 2" > /docs/data.txt
# cat /docs/data.txt
version 2
回滚到 version1 快照:
# zfs list -t snapshot
NAME                     USED  AVAIL  REFER  MOUNTPOINT
datapool/docs@version1  9.50K      -  19.5K  -
# zfs rollback datapool/docs@version1
# cat /docs/data.txt
version 1
重命名快照:
# zfs rename datapool/docs@version1 datapool/docs@version2
# zfs list -t snapshot
NAME                     USED  AVAIL  REFER  MOUNTPOINT
datapool/docs@version2  9.50K      -  19.5K  -
注意: 当一个 dataset 存在快照时,无法直接删除。但可使用 -r 参数强制删除。
# zfs destroy datapool/docs
cannot destroy 'datapool/docs': filesystem has children
use '-r' to destroy the following datasets:
datapool/docs@version2
# zfs destroy -r datapool/docs
# zfs list -t snapshot
no datasets available
克隆是一个可写卷或文件系统,其初始内容与被克隆的数据集相同。
克隆只能从快照中创建,在删除克隆以前,对应的快照无法删除。
创建一个克隆先要创建一个快照:
# zfs create datapool/docs -o mountpoint=/docs
# zfs list -r datapool
NAME            USED  AVAIL  REFER  MOUNTPOINT
datapool       93.5K  1.92G    19K  /datapool
datapool/docs    19K  1.92G    19K  /docs
# mkdir /docs/folder{1..5}
# ls /docs/
folder1  folder2  folder3  folder4  folder5
# zfs snapshot datapool/docs@today
# zfs list -t snapshot
NAME                  USED  AVAIL  REFER  MOUNTPOINT
datapool/docs@today      0      -    19K  -
从快照创建一个克隆:
# zfs clone datapool/docs@today datapool/pict
# zfs list
NAME            USED  AVAIL  REFER  MOUNTPOINT
datapool        166K  1.92G    19K  /datapool
datapool/docs    19K  1.92G    19K  /docs
datapool/pict     1K  1.92G    19K  /datapool/pict
在克隆线程结束以后,基于快照 datapool/docs@today 的数据已被克隆到 datapool/pict。此时 datapool/pict 与 datapool/docs 中的数据相同:
# ls /datapool/pict
folder1  folder2  folder3  folder4  folder5
在删除克隆以前,对应的快照无法删除:
# zfs destroy datapool/docs@today
cannot destroy 'datapool/docs@today': snapshot has dependent clones
use '-R' to destroy the following datasets:
datapool/pict
要先删快照:
# zfs destroy datapool/pict
再删克隆:
# zfs destroy datapool/docs@today
# zfs list -t snapshot
no datasets available
ZFS 池复制基于快照实现。快照可以随时被创建,数量不限。通过不断创建、传输和恢复快照,可以实现在一台或机器间同步池中数据。ZFS提供了一个内置的序列化功能,可以将数据以 stream 的形式发送到标准输出。
创建备份池:
# zpool create backuppool mirror sde sdf
# zpool list
NAME         SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
backuppool  1.98G    50K  1.98G         -     0%     0%  1.00x  ONLINE  -
datapool    1.98G   568K  1.98G         -     0%     0%  1.00x  ONLINE  -
检查池信息:
# zpool status
  pool: datapool
 state: ONLINE
  scan: none requested
config:
        NAME        STATE     READ WRITE CKSUM
        datapool    ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            sdb     ONLINE       0     0     0
            sdc     ONLINE       0     0     0
errors: No known data errors
  pool: backuppool
 state: ONLINE
  scan: none requested
config:
        NAME        STATE     READ WRITE CKSUM
        backuppool    ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            sde     ONLINE       0     0     0
            sdf     ONLINE       0     0     0
errors: No known data errors
给要备份的 dataset 创建一个快照:
# zfs snapshot datapool/docs@today
# zfs list -t snapshot
NAME                  USED  AVAIL  REFER  MOUNTPOINT
datapool/docs@today      0      -    19K  -
# ls /docs/
folder1  folder2  folder3  folder4  folder5
复制开始:
# zfs send datapool/docs@today | zfs receive backuppool/backup
# zfs list
NAME                USED  AVAIL  REFER  MOUNTPOINT
backuppool           83K  1.92G    19K  /backuppool
backuppool/backup    19K  1.92G    19K  /backuppool/backup
datapool            527K  1.92G    19K  /datapool
datapool/docs        19K  1.92G    19K  /docs
# ls /backuppool/backup
folder1  folder2  folder3  folder4  folder5
把数据复制到其它机器:
# zfs send datapool/docs@today | ssh otherserver zfs recv backuppool/backup